top-level await
のでコードをIIAFE (Immediately Invoked Async Function Expression) (async () => {})() で囲う必要がある
可読性低下
静的解析が難しい
テストしづらい
あるモジュールの読み込み中にawaitがあるとそれを置いておいて次のモジュールの読み込みに入る
code:index.mjs
import "./child-a.mjs";
import "./child-b.mjs";
console.log("親モジュール 実行");
code:child-a.mjs
import { setTimeout } from "timers/promises";
console.log("child-a 読み込み");
await setTimeout(2000);
console.log("child-a 2秒後");
code:child-b.mjs
import { setTimeout } from "timers/promises";
console.log("child-b 読み込み");
await setTimeout(1000);
console.log("child-b 1秒後");
code:結果
❯ node top-level-await/index.mjs
child-a 読み込み
child-b 読み込み
child-b 1秒後
child-a 2秒後
親モジュール
CommonJSのrequire()は同期的なのでCommonJSではtop-level awaitできない